package ru.iteco.Java.study.MSGR;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import static javax.swing.JOptionPane.*;



/**
 * Этот класс хранит информацию о текущем соединении
 * ip - ip-адресс владельца
 * login - логин владельца
 * содержит класс Receiver, принимающий ванные извне
 */
public class Connection {
	
	//если не известен логин - пишем ip и порт
	public Connection(String ip,int port) {
		this(ip,ip,port);
	}
	
	public Connection(String ip,String login,int port) {
		this.ip=ip;
		this.login=login;
		this.port=port;
		try
		{
			this.sock=new Socket(ip,this.port);
			this.in=new Scanner(this.sock.getInputStream());
			this.out=new PrintWriter(this.sock.getOutputStream());
		} catch (UnknownHostException e) {
			showMessageDialog(null, "Пользователь "+this.login+"["+this.ip+"] недоступен!", "Connection()", ERROR_MESSAGE);
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.rvr=new Receiver();
		this.thr=new Thread(rvr);
		this.thr.start();
	}
	
	public Connection(Socket sock)
	{
		this.sock=sock;
		try {
			this.in=new Scanner(this.sock.getInputStream());
			this.out=new PrintWriter(this.sock.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.ip=sock.getInetAddress().toString();
		this.login=sock.getInetAddress().toString();
		this.rvr=new Receiver();
		this.thr=new Thread(rvr);
		this.thr.start();
	}
	
	
	
	public void sendMessage(String sOut)
	{
		out.println(sOut);
		out.flush();
	}
	
	@Override
	protected void finalize() throws Throwable {
		this.sock.close();
		super.finalize();
	}
	
	public void setIp(String ip) {
		this.ip = ip;
	}
	public String getIP() {
		return ip;
	}
	
	
	public void setLogin(String login) {
		this.login = login;
	}
	public String getLogin() {
		return login;
	}
	
	public void setPort(int port) {
		this.port = port;
	}
	public int getPort() {
		return port;
	}
	
	private int port;//текущий порт(временно совпадает с CurrentPort из Connector)
	private Socket sock;//сокет для передачи данных
	private Scanner in;//для получения данных извне
	private PrintWriter out;//для отправки данных
	private String ip="unknown",login="no name";//данные о пользователе
	private Receiver rvr;//класс,реализующий получающий поток
	private Thread thr;//поток класса rvr
	
	/**
	 * Receiver реализует поток ожидания данных
	 */
	private class Receiver implements Runnable
	{
		public Receiver() 
		{
			
		}
		public void recv()
		{
				while(Connection.this.in.hasNext())
				{
					mess=Connection.this.in.nextLine();
					//Connection.this.out.println(mess);
					System.out.println("from:"+Connection.this.login+"\n"+mess);
					//JOptionPane.showMessageDialog(null, mess);
				}
		}
		
		private String mess;

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true) recv();
		}
	}
}
